/*
 * BlockStorageStrategy.h
 *
 *  Created on: 03/10/2009
 *      Author: nik0l4z
 */

#ifndef BLOCKSTORAGESTRATEGY_H_
#define BLOCKSTORAGESTRATEGY_H_
#include "StorageStrategy.h"
#include "Bloque.h"
#include "TablaEspacioLibre.h"
#include "ArchivoBinario.h"
#include "ArchivoTexto.h"

using namespace std;

class BlockStorageStrategy :public StorageStrategy {

	private: Almacenamiento *almacenamiento;

	private: TablaEspacioLibre *tablaEspacioLibre ;

	private: int tamanioBloque;
	private: int tamanioCritico;
	private: list<Registro>::iterator* buscarRegistro(Bloque* bloque, Clave* clave);

	private: string nombreArchivo;

	private: bool buscarEnBuffer (Bloque* bloque, int nroBloque);

	private: void deleteDataBuffer(Clave* clave, int filePos);

	private: void Compactar();

	public: BlockStorageStrategy();

	public: BlockStorageStrategy(const string& nombrearchivo, int tamanioBloque);

	public: BlockStorageStrategy(const string& nombreArchivoEspacioLibre, int tamanioBloque, int porcentajeLimite);

	public: virtual ~BlockStorageStrategy();

	public: virtual int saveData(Dato *data);

	public: virtual void deleteData(Clave* clave, int filePos);

	public: virtual int updateData(Dato* datos, int filePos);

	public: virtual string getData(Clave *clave, int fileReference);

	public: void virtual setStorage(Almacenamiento *storage);

	public: virtual Almacenamiento *getStorage() const;

	//Agrego la posibilidad de grabar un bloque recibido por parametro
	// segun lo conversado

	public: void GrabarBloque(Bloque bloque);
	public: string PrepararBloque (Bloque bloque);

	public: Bloque* LeerBloque(int pos);


};

#endif /* BLOCKSTORAGESTRATEGY_H_ */
